Checksum des trames de téléinformation enedis
INFO
Voir la page Suivi de la téléinformation ERDF avec arduino
Documentation Enedis

Python
def checksum(frame):
somme = 0
for c in frame[:-1]:
somme += ord(c)
somme_trunc = bin(somme)[-6:]
calc_check = chr(32 + int(somme_trunc, 2))
if calc_check == frame[-1:]:
return True
else:
return False
JavaScript
function checksum(frame) {
let somme = 0;
for (let i = 0; i < frame.length - 1; i++) {
somme += frame.charCodeAt(i);
}
const sommeTrunc = (somme & 0b111111).toString(2);
const calcCheck = String.fromCharCode(32 + parseInt(sommeTrunc, 2));
if (calcCheck === frame.slice(-1)) {
return true;
} else {
return false;
}
}
C
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
bool checksum(const char *frame) {
size_t longueur = strlen(frame);
unsigned int somme = 0;
if (longueur == 0) {
return false;
}
for (size_t i = 0; i < longueur - 1; i++) {
somme += (unsigned char)frame[i];
}
char calc_check = (char)(32 + (somme & 0b111111));
return calc_check == frame[longueur - 1];
}
Rust
fn checksum(frame: &str) -> bool {
let octets = frame.as_bytes();
let mut somme: u32 = 0;
if octets.is_empty() {
return false;
}
for octet in &octets[..octets.len() - 1] {
somme += u32::from(*octet);
}
let calc_check = 32 + (somme & 0b111111) as u8;
calc_check == octets[octets.len() - 1]
}